This commit is contained in:
Mateusz Gruszczyński committed 2026-10-07 08:51:04 +02:00
1 parent a9f9450f80
commit 762eb9e28b
81 files changed
+1242 -1095

No files matched your search

+27 -29
View File
@@ -123,7 +123,7 @@ def upgrade_smoke(tmp: Path) -> None:
assert backup.is_dir()
assert (backup / "src/obsolete.rs").is_file()
assert not (target / "src/obsolete.rs").exists()
assert 'version = "0.26.7"' in (target / "Cargo.toml").read_text(encoding="utf-8")
assert 'version = "0.27.0"' in (target / "Cargo.toml").read_text(encoding="utf-8")
assert (target / "data/keep.txt").read_text(encoding="utf-8") == "preserve\n"
assert (target / ".env").read_text(encoding="utf-8") == "RUST_PROXY_DEMO=0\n"
assert (target / "langs/site.json").is_file()
@@ -134,7 +134,7 @@ def upgrade_smoke(tmp: Path) -> None:
assert (target / "docker-agent/certificate.go").is_file()
assert (target / "docker-agent/server.go").is_file()
manifest = json.loads((backup / "upgrade.json").read_text(encoding="utf-8"))
assert manifest["to_version"] == "0.26.7"
assert manifest["to_version"] == "0.27.0"
assert manifest["removed_obsolete_runtime_state"] is True
assert not legacy.exists()
assert not (backup / "legacy-data").exists()
@@ -571,7 +571,7 @@ def source_contract_smoke() -> None:
assert marker in admin, marker
anonymous_block = admin.split("fn anonymous_allowed", 1)[1].split("const CERTIFICATE_API_KEY_HEADER", 1)[0]
assert '"/api/status"' not in anonymous_block
assert '"RuntimeInformation"' in openapi_0241 and '"version": "0.26.7"' in openapi_0241
assert '"RuntimeInformation"' in openapi_0241 and '"version": "0.27.0"' in openapi_0241
assert 'id="panel-logging"' not in html
for marker in ['id="settings-tab-logging"', 'id="settings-page-logging"', 'id="logging-form"', 'id="error-log-form"']:
assert marker in html, marker
@@ -985,7 +985,16 @@ def source_contract_smoke() -> None:
vhosts_ui = read_vhosts_js(ROOT)
for marker in ['pub enum AppliedEncoding', 'AppliedEncoding::Gzip', 'AppliedEncoding::Brotli', 'AppliedEncoding::Zstd', 'AppliedEncoding::Deflate']:
assert marker in compression_source, marker
assert 'quality_weights_can_select_each_enabled_codec' in compression_source
for marker in [
'gzip: true', 'br: true', 'zstd: true', 'deflate: false',
'const PREFERENCE: [Self; 4] = [Self::Zstd, Self::Brotli, Self::Gzip, Self::Deflate]',
'quality_weights_win_before_server_priority',
'equal_quality_uses_zstd_then_br_then_gzip_then_deflate',
'cookies_authorization_and_private_cache_policy_do_not_disable_compression',
'existing_content_encoding_is_never_recompressed',
]:
assert marker in compression_source, marker
assert 'AllowCookie' not in compression_source
diagnostics_source = rust_source(ROOT, 'src/diagnostics.rs') + rust_source(ROOT, 'src/system_stats/mod.rs') + rust_source(ROOT, 'src/system_stats/linux.rs')
for marker in ['pub struct NetworkInterfaceView', 'pub network_interfaces: Vec<NetworkInterfaceView>', 'sysinfo::Networks::new_with_refreshed_list', 'system.network_stats', 'collect_network_systemstat', 'normalize_network_interfaces', 'merge_network_interfaces']:
assert marker in diagnostics_source, marker
@@ -1003,13 +1012,19 @@ def source_contract_smoke() -> None:
assert 'compressionCountersHelp' not in ui_html
assert 'sparkline-h1' in (ROOT / 'src/admin/web/index.html').read_text(encoding='utf-8')
assert 'body[data-density="compact"]' in style_source and '--ui-control: 22px' in style_source
compact_style_0270 = style_source.replace(' ', '')
for marker in ['progress::-webkit-progress-bar', 'progress::-webkit-progress-value', 'progress::-moz-progress-bar', '-webkit-appearance:none']:
assert marker in compact_style_0270, marker
assert 'status.backend_pool_domains' in vhosts_ui and 'payload["backend_pool_domains"]' in admin
docker_source = rust_source(ROOT, 'src/docker.rs')
management_ui = (ROOT / 'src/admin/web/management.js').read_text(encoding='utf-8')
for marker in ['function aliasEditor(', 'host-chip-editor docker-alias-editor', '.docker-force-ssl', '.docker-websockets', '.docker-cache-enabled', '.docker-passive-enabled', '.docker-passive-5xx', '.docker-agent-acl-profile']:
for marker in ['function aliasEditor(', 'host-chip-editor docker-alias-editor', '.docker-force-ssl', '.docker-websockets', '.docker-cache-enabled', '.docker-compression-enabled', '.docker-compression-zstd', '.docker-compression-br', '.docker-compression-gzip', '.docker-compression-deflate', '.docker-passive-enabled', '.docker-passive-5xx', '.docker-agent-acl-profile']:
assert marker in docker_ui, marker
for marker in ['"force_ssl": assignment.force_ssl.unwrap_or(false)', '"websockets": assignment.websockets', '"cache": {"enabled": assignment.cache_enabled}', '"passive_health": assignment.passive_health.clone()', 'assignment.acl_profile_id.clone().or_else(|| agent.acl_profile_id.clone())']:
for marker in ['"force_ssl": assignment.force_ssl.unwrap_or(false)', '"websockets": assignment.websockets', '"enabled": assignment.compression_enabled', '"zstd": assignment.compression_zstd', '"br": assignment.compression_br', '"gzip": assignment.compression_gzip', '"deflate": assignment.compression_deflate', '"cache": {"enabled": assignment.cache_enabled}', '"passive_health": assignment.passive_health.clone()', 'assignment.acl_profile_id.clone().or_else(|| agent.acl_profile_id.clone())', 'host.transient_unavailable = target.is_none()', 'inventory: previous_inventory']:
assert marker in docker_source, marker
route_cache_0270 = rust_source(ROOT, 'src/proxy/forward/route_cache.rs')
for marker in ['if route.unavailable', 'StatusCode::SERVICE_UNAVAILABLE', 'published Docker service is currently unavailable', 'retry-after']:
assert marker in route_cache_0270, marker
assert 'agent.acl_profile_id === profile.id' in management_ui
vhost_source = rust_source(ROOT, 'src/vhost.rs')
for marker in ['DEFAULT_PROXY_CONNECT_TIMEOUT_SECONDS: u64 = 10', 'DEFAULT_PROXY_RESPONSE_HEADER_TIMEOUT_SECONDS: u64 = 120', 'DEFAULT_PROXY_READ_TIMEOUT_SECONDS: u64 = 60', 'DEFAULT_PROXY_SEND_TIMEOUT_SECONDS: u64 = 60', 'proxy_timeouts_have_explicit_safe_defaults_but_keep_null_compatibility']:
@@ -1028,7 +1043,7 @@ def source_contract_smoke() -> None:
assert '.managed-update' in main and "flush_hot_to_cold_for_update" in main
openapi = (ROOT / "src/admin/openapi.json").read_text(encoding="utf-8")
assert '"/api/config/history/restore"' in openapi
for marker in ['"version": "0.26.7"', '"memory_preset"', '"cold_preset"', '"memory_budget_bytes"', '"max_inflight"', '"preset"', '"session_days"', '"session_lifetime_seconds"', '"accept_local_listener_risk"', '"backend_header"', '"backend_timing_header"', '"cold_on_age"', '"match_type"', '"regex_insensitive"', '"NotFoundHost"', '"not_found_hosts"', '"PrometheusSettings"', '"allow_trusted_network_without_token"', '"include_docker_vhosts"', '"include_streams"', '"include_logging"']:
for marker in ['"version": "0.27.0"', '"memory_preset"', '"cold_preset"', '"memory_budget_bytes"', '"max_inflight"', '"preset"', '"session_days"', '"session_lifetime_seconds"', '"accept_local_listener_risk"', '"backend_header"', '"backend_timing_header"', '"cold_on_age"', '"match_type"', '"regex_insensitive"', '"NotFoundHost"', '"not_found_hosts"', '"PrometheusSettings"', '"allow_trusted_network_without_token"', '"include_docker_vhosts"', '"include_streams"', '"include_logging"']:
assert marker in openapi, marker
assert '"software_update"' in openapi and '"update_available"' in openapi
for marker in ['"/api/certificates/deploy"', '"CertificateDeploy"', '"CertificateDeployResult"', '"/api/certificates/reload"']:
@@ -1116,24 +1131,9 @@ def container_contract_smoke() -> None:
assert marker in ignore, marker
assert (ROOT / "docs/CONTAINER.md").is_file()
def debian_grafana_contract_smoke() -> None:
control = (ROOT / "debian/control").read_text(encoding="utf-8")
rules = (ROOT / "debian/rules").read_text(encoding="utf-8")
service = (ROOT / "debian/rustproxy.service").read_text(encoding="utf-8")
environment = (ROOT / "debian/rustproxy.environment").read_text(encoding="utf-8")
logrotate = (ROOT / "debian/rustproxy.logrotate").read_text(encoding="utf-8")
postinst = (ROOT / "debian/rustproxy.postinst").read_text(encoding="utf-8")
repo = (ROOT / "debian/build-repository.sh").read_text(encoding="utf-8")
def grafana_contract_smoke() -> None:
assert not (ROOT / "debian").exists(), "Debian packaging belongs to the external packaging repository"
dashboard = json.loads((ROOT / "grafana/rustproxy-overview.json").read_text(encoding="utf-8"))
assert "debhelper-compat (= 13)" in control and "cargo" in control and "rustc" in control
assert "cargo build --release --locked" in rules and "cargo test --locked" in rules
for marker in ["User=rustproxy", "Group=rustproxy", "Environment=MALLOC_ARENA_MAX=2", "AmbientCapabilities=CAP_NET_BIND_SERVICE", "StateDirectory=rustproxy", "LogsDirectory=rustproxy", "ProtectSystem=strict", "ReadWritePaths=/var/lib/rustproxy /var/log/rustproxy"]:
assert marker in service, marker
assert "RUST_PROXY_ADMIN_LISTEN=127.0.0.1:9090" in environment
for marker in ["daily", "rotate 3", "maxage 3", "compresscmd /usr/bin/gzip", "compressoptions -9", "copytruncate", "su rustproxy rustproxy"]:
assert marker in logrotate, marker
assert "/var/log/rustproxy" in postinst and "-o rustproxy -g rustproxy" in postinst
assert "rustproxy.linuxiarz.pl" in repo and "dpkg-scanpackages" in repo and "gzip -9 -n" in repo
assert dashboard.get("uid") == "rustproxy-0170"
queries = json.dumps(dashboard)
for marker in ["rust_proxy_process_rss_bytes", "rust_proxy_cache_transient_bytes", "rust_proxy_backend_ewma_latency_seconds", "rust_proxy_certificate_renewal_not_after_timestamp_seconds", "rust_proxy_not_found_hosts_configured", "rust_proxy_http1_requests_total", "rust_proxy_backend_upstream_client_generation_requests", "rust_proxy_backend_upstream_client_generation_age_seconds", "rust_proxy_backend_retry_attempts_total", "rust_proxy_backend_upstream_client_rotations_total", "rust_proxy_docker_backend_upstream_client_generation_requests", "rust_proxy_docker_backend_retry_attempts_total"]:
@@ -1181,9 +1181,7 @@ def reproducible_archive_smoke(tmp: Path) -> None:
assert "RustProxy/nagios/check_rustproxy_api" in names
assert "RustProxy/src/admin/web/host404.js" in names
assert "RustProxy/docs/NOT_FOUND_HOSTS.md" in names
assert "RustProxy/debian/control" in names
assert "RustProxy/debian/rustproxy.service" in names
assert "RustProxy/debian/rustproxy.logrotate" in names
assert not any(name.startswith("RustProxy/debian/") for name in names)
assert "RustProxy/grafana/rustproxy-overview.json" in names
assert "RustProxy/UPDATE_CHECK.toml" in names
assert "RustProxy/src/update_check.rs" in names
@@ -1208,8 +1206,8 @@ def main() -> None:
ui_contract_smoke()
source_contract_smoke()
container_contract_smoke()
debian_grafana_contract_smoke()
print("PASS: 0.26.7 SQLite/upgrade, local-response 404 hosts, Prometheus/Grafana diagnostics, Debian packaging, cache/dashboard/logging/Nagios, retained admin/H3/stream/TLS contracts and reproducible source archives.")
grafana_contract_smoke()
print("PASS: 0.27.0 SQLite/upgrade, local-response 404 hosts, Prometheus/Grafana diagnostics, external Debian-packaging separation, cache/dashboard/logging/Nagios, retained admin/H3/stream/TLS contracts and reproducible source archives.")
if __name__ == "__main__":