Files
jobtrackingapp/dev/verify_ollama.py
T

57 lines
2.7 KiB
Python

"""Verify the dedicated development model cache before local inference."""
import argparse
import hashlib
import json
import re
import subprocess
import urllib.request
from pathlib import Path
MODEL = "qwen2.5:7b"
MANIFEST = "845dbda0ea48ed749caafd9e6037047aa19acfcfd82e704d7ca97d631a0b697e"
IMAGE = "ollama/ollama:0.40.11@sha256:459985308d740b99071719baec2740a60f5b2b2d9b835c171991ae25690203da"
CONTAINER = "jobjakt-dev-ollama-ollama-1"
def run(*arguments):
return subprocess.check_output(["rtk", "proxy", *arguments], text=True).strip()
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--manifest", required=True, type=Path)
parser.add_argument("--output", required=True, type=Path)
args = parser.parse_args()
source = args.manifest.read_bytes()
assert hashlib.sha256(source).hexdigest() == MANIFEST, "Registry manifest changed"
manifest = json.loads(source)
container = json.loads(run("docker", "inspect", CONTAINER))[0]
assert container["Config"]["Labels"]["com.docker.compose.project"] == "jobjakt-dev-ollama"
assert container["Image"] == json.loads(run("docker", "image", "inspect", IMAGE))[0]["Id"]
assert "OLLAMA_NO_CLOUD=1" in container["Config"]["Env"]
assert container["HostConfig"]["ReadonlyRootfs"]
assert container["HostConfig"]["Memory"] == 8 * 1024**3
assert all(mount.get("Name") == "jobjakt-dev-ollama-models" for mount in container["Mounts"] if mount["Type"] == "volume")
descriptors = [manifest["config"], *manifest["layers"], {"digest": "sha256:" + MANIFEST}]
checked = []
for descriptor in descriptors:
digest = descriptor["digest"]
assert re.fullmatch(r"sha256:[a-f0-9]{64}", digest)
path = "/root/.ollama/models/blobs/" + digest.replace(":", "-")
actual = run("docker", "exec", CONTAINER, "sha256sum", path).split()[0]
assert actual == digest[7:], "Downloaded model blob changed"
checked.append(digest)
with urllib.request.urlopen("http://127.0.0.1:11434/api/tags", timeout=5) as response:
models = json.load(response)["models"]
actual = next(model for model in models if model["name"] == MODEL)
assert actual["digest"] == MANIFEST
args.output.parent.mkdir(parents=True, exist_ok=True)
record = {"status": "PASS", "model": MODEL, "manifestSha256": MANIFEST, "checkedBlobs": checked,
"image": IMAGE, "details": actual["details"], "limits": "Local artifact verification only; no inference, production digest parity or extraction accuracy claim."}
args.output.write_text(json.dumps(record, indent=2) + "\n", encoding="utf-8")
print(json.dumps(record))
if __name__ == "__main__":
main()