Files
proxmox/scripts/lib/apply_elemental_imperium_wallet_labels.py
defiQUG 4fab998e51
All checks were successful
Deploy to Phoenix / deploy (push) Successful in 9s
chore: sync workspace docs, configs, and submodules
2026-04-18 12:07:15 -07:00

132 lines
4.1 KiB
Python

#!/usr/bin/env python3
"""
Apply Elemental Imperium matrix labels to config/pmm-soak-wallet-grid.json.
Each wallet gains:
cellId — immutable coordinate label (EI-L##-B##-C#)
networkCode — from registry default, overlay rangeRules, then cellOverrides
asn — same layering; null until known
label — {networkCode}.{cellId}[.AS{n}]
Run from repo root:
python3 scripts/lib/apply_elemental_imperium_wallet_labels.py
Options:
--network-code CODE Base networkCode for all wallets (before overlay).
--asn N Base ASN for all wallets (before overlay).
--overlay PATH JSON overlay (see config/elemental-imperium-wallet-overlay.example.json)
"""
from __future__ import annotations
import argparse
import json
import sys
from pathlib import Path
_REPO_LIB = Path(__file__).resolve().parent
if str(_REPO_LIB) not in sys.path:
sys.path.insert(0, str(_REPO_LIB))
from elemental_imperium_wallet_common import ( # noqa: E402
build_label,
cell_id,
resolve_network_asn,
)
def load_registry(repo_root: Path) -> tuple[str, dict]:
reg_path = repo_root / "config" / "elemental-imperium-network-registry.json"
reg = json.loads(reg_path.read_text(encoding="utf-8"))
default = reg.get("defaultNetworkCode", "unassigned")
return default, reg
def load_overlay(path: Path) -> dict:
o = json.loads(path.read_text(encoding="utf-8"))
if not isinstance(o, dict):
raise SystemExit("Overlay must be a JSON object")
return o
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"--network-code",
dest="network_code",
default=None,
help="Base networkCode for every wallet (before overlay)",
)
parser.add_argument(
"--asn",
type=int,
default=None,
help="Base ASN for every wallet (before overlay)",
)
parser.add_argument(
"--overlay",
type=Path,
default=None,
help="Path to overlay JSON (rangeRules + cellOverrides)",
)
args = parser.parse_args()
repo_root = Path(__file__).resolve().parents[2]
grid_path = repo_root / "config" / "pmm-soak-wallet-grid.json"
default_net, registry = load_registry(repo_root)
base_network = args.network_code or default_net
base_asn = args.asn
overlay: dict | None = None
overlay_path_str: str | None = None
if args.overlay:
overlay = load_overlay(args.overlay.resolve())
overlay_path_str = str(args.overlay)
data = json.loads(grid_path.read_text(encoding="utf-8"))
wallets = data.get("wallets")
if not isinstance(wallets, list):
raise SystemExit("Invalid grid: missing wallets array")
spec = registry.get("labelSpec", {})
labeling = {
"specId": spec.get("id", "ei-wallet-label-v1"),
"registryPath": "config/elemental-imperium-network-registry.json",
"defaultNetworkCode": default_net,
"baseNetworkCode": base_network,
"baseAsn": base_asn,
"overlayPath": overlay_path_str,
"cellIdFormat": spec.get("cellIdFormat", "EI-L{lpbca:02d}-B{branch:02d}-C{class}"),
"labelFormats": {
"default": spec.get("labelFormatDefault", "{networkCode}.{cellId}"),
"withAsn": spec.get("labelFormatWithAsn", "{networkCode}.{cellId}.AS{asn}"),
},
}
for w in wallets:
lpbca = int(w["lpbca"])
branch = int(w["branch"])
class_ = int(w["class"])
cid = cell_id(lpbca, branch, class_)
w["cellId"] = cid
net, asn = resolve_network_asn(w, cid, base_network, base_asn, overlay)
w["networkCode"] = net
w["asn"] = asn
w["label"] = build_label(net, cid, asn)
ver = max(int(data.get("version", 1)), 2)
out = {
"version": ver,
"dimensions": data["dimensions"],
"derivation": data["derivation"],
"labeling": labeling,
"wallets": wallets,
}
grid_path.write_text(json.dumps(out, indent=2, sort_keys=False) + "\n", encoding="utf-8")
print(f"Wrote {len(wallets)} wallets to {grid_path}")
if __name__ == "__main__":
main()