mirror of https://github.com/mongodb/mongo
116 lines
4.0 KiB
Python
Executable File
116 lines
4.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
MongoDB Toolchain configuration generator for DevContainers.
|
|
|
|
Generates toolchain_config.env with URLs and SHA256 checksums for both ARM64 and AMD64.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
from datetime import datetime
|
|
|
|
# Add script directory to path for importing local modules
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
from s3_artifact_utils import calculate_sha256, download_file, list_s3_objects
|
|
|
|
# S3 bucket and prefix
|
|
BUCKET = "boxes.10gen.com"
|
|
PREFIX = "build/toolchain/mongodbtoolchain-ubuntu2404"
|
|
|
|
|
|
def fetch_toolchain_info(arch: str) -> dict:
|
|
"""Fetch toolchain info for a specific architecture."""
|
|
print(f"\n🔍 Fetching {arch} toolchain...", file=sys.stderr)
|
|
|
|
# Use path-style URL because bucket name contains dots (boxes.10gen.com)
|
|
# amd64 toolchains don't have an architecture suffix, so we need to exclude arm64
|
|
if arch == "amd64":
|
|
arch_prefix = PREFIX
|
|
exclude_pattern = "-arm64-"
|
|
else:
|
|
arch_prefix = f"{PREFIX}-{arch}"
|
|
exclude_pattern = None
|
|
|
|
objects = list_s3_objects(BUCKET, arch_prefix, path_style=True)
|
|
|
|
# Filter out excluded patterns
|
|
if exclude_pattern:
|
|
objects = [obj for obj in objects if exclude_pattern not in obj["Key"]]
|
|
|
|
if not objects:
|
|
print(f"No artifacts found with prefix: {arch_prefix}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
latest = max(objects, key=lambda x: x["LastModified"])
|
|
url = f"https://s3.amazonaws.com/{BUCKET}/{latest['Key']}"
|
|
key = latest["Key"]
|
|
last_modified = latest["LastModified"]
|
|
|
|
print(f"Latest: {key}", file=sys.stderr)
|
|
print(f"Modified: {last_modified}", file=sys.stderr)
|
|
|
|
# Download to temp location to calculate checksum
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix=".tar.gz") as tmp:
|
|
tmp_path = tmp.name
|
|
|
|
try:
|
|
download_file(url, tmp_path)
|
|
sha256 = calculate_sha256(tmp_path)
|
|
print(f"SHA256: {sha256}", file=sys.stderr)
|
|
finally:
|
|
os.unlink(tmp_path)
|
|
|
|
toolchain_id = os.path.basename(key).replace(".tar.gz", "")
|
|
|
|
return {
|
|
"url": url,
|
|
"sha256": sha256,
|
|
"key": key,
|
|
"last_modified": last_modified,
|
|
"toolchain_id": toolchain_id,
|
|
}
|
|
|
|
|
|
def main():
|
|
"""Generate toolchain configuration file."""
|
|
# Fetch both architectures
|
|
arm64_info = fetch_toolchain_info("arm64")
|
|
amd64_info = fetch_toolchain_info("amd64")
|
|
|
|
# Determine output path
|
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
output_file = os.path.join(script_dir, "toolchain_config.env")
|
|
|
|
# Write config file
|
|
with open(output_file, "w") as f:
|
|
f.write("# Generated by toolchain.py\n")
|
|
f.write("# DO NOT EDIT MANUALLY - run: python3 toolchain.py\n")
|
|
f.write("#\n")
|
|
f.write(f"# Generated: {datetime.now().isoformat()}\n")
|
|
f.write("\n")
|
|
f.write("# ARM64 Toolchain\n")
|
|
f.write(f"# Last Modified: {arm64_info['last_modified'].isoformat()}\n")
|
|
f.write(f"# Toolchain ID: {arm64_info['toolchain_id']}\n")
|
|
f.write(f'TOOLCHAIN_ARM64_URL="{arm64_info["url"]}"\n')
|
|
f.write(f'TOOLCHAIN_ARM64_SHA256="{arm64_info["sha256"]}"\n')
|
|
f.write(f'TOOLCHAIN_ARM64_KEY="{arm64_info["key"]}"\n')
|
|
f.write(f'TOOLCHAIN_ARM64_LAST_MODIFIED="{arm64_info["last_modified"].isoformat()}"\n')
|
|
f.write("\n")
|
|
f.write("# AMD64 Toolchain\n")
|
|
f.write(f"# Last Modified: {amd64_info['last_modified'].isoformat()}\n")
|
|
f.write(f"# Toolchain ID: {amd64_info['toolchain_id']}\n")
|
|
f.write(f'TOOLCHAIN_AMD64_URL="{amd64_info["url"]}"\n')
|
|
f.write(f'TOOLCHAIN_AMD64_SHA256="{amd64_info["sha256"]}"\n')
|
|
f.write(f'TOOLCHAIN_AMD64_KEY="{amd64_info["key"]}"\n')
|
|
f.write(f'TOOLCHAIN_AMD64_LAST_MODIFIED="{amd64_info["last_modified"].isoformat()}"\n')
|
|
|
|
print(f"\n✅ Configuration written to: {output_file}", file=sys.stderr)
|
|
print("\nContents:", file=sys.stderr)
|
|
with open(output_file) as f:
|
|
print(f.read(), file=sys.stderr)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|