Files
go-omni/scripts/verifyLinux.py

85 lines
3.1 KiB
Python
Executable File

#!/usr/bin/env python3
"""Run GoOmni's repeatable Linux checks inside a pinned Go Docker image."""
import argparse
from pathlib import Path
import shutil
import shlex
import subprocess
import sys
def workspace_output(root: Path, value: str) -> tuple[Path, str]:
requested = Path(value)
host_path = requested if requested.is_absolute() else root / requested
host_path = host_path.resolve()
try:
relative = host_path.relative_to(root)
except ValueError as exc:
raise SystemExit("--output must be inside the repository") from exc
host_path.parent.mkdir(parents=True, exist_ok=True)
return host_path, "/workspace/" + relative.as_posix()
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--image", default="golang:1.25", help="Docker image (default: golang:1.25)")
parser.add_argument("--gomaxprocs", type=int, default=4)
parser.add_argument("--load", action="store_true", help="also run the isolated server matrix")
parser.add_argument("--tls", action="store_true", help="run the load matrix over TLS")
parser.add_argument("--duration", default="2s", help="duration per traffic case (up to 30m)")
parser.add_argument("--count", type=int, default=3)
parser.add_argument("--concurrency", default="1,32,128")
parser.add_argument("--idle", default="128,1024")
parser.add_argument("--output", help="JSON report path inside the repository")
args = parser.parse_args()
if args.gomaxprocs < 1 or args.count < 1:
parser.error("--gomaxprocs and --count must be positive")
if args.tls and not args.load:
parser.error("--tls requires --load")
root = Path(__file__).resolve().parent.parent
docker = shutil.which("docker")
if docker is None:
raise SystemExit("docker is required for Linux verification")
commands = [
"go test -race ./...",
"go vet ./...",
"go build ./...",
]
if args.load:
load = [
"go", "run", "./internal/perfcheck",
"--duration", args.duration,
"--count", str(args.count),
"--concurrency", args.concurrency,
"--idle", args.idle,
]
if args.tls:
load.append("--tls")
if args.output:
_, container_path = workspace_output(root, args.output)
load += ["--output", container_path]
commands.append(" ".join(shlex.quote(part) for part in load))
command = " && ".join(commands)
docker_args = [
docker, "run", "--rm", "--pull=missing",
"-v", f"{root}:/workspace",
"-w", "/workspace",
"-e", "GOWORK=off",
"-e", f"GOMAXPROCS={args.gomaxprocs}",
args.image, "sh", "-c", command,
]
print(f"Linux verification image: {args.image}", flush=True)
print(f"Linux verification command: {command}", flush=True)
result = subprocess.run(docker_args, cwd=root)
if result.returncode != 0:
raise SystemExit(f"Linux verification failed with exit code {result.returncode}")
print("PASS Linux verification", flush=True)
if __name__ == "__main__":
main()