import sys, json, subprocess, pathlib, hashlib, shutil, urllib.request, os
sys.path.insert(0, '/workspace/contextra-analytics-runtime-lifecycle-refactor')
from tools.validate_deployment import load_env_file, validate_deployment_inputs
from model_tooling.deploy import deployment_plan, snapshot
from model_tooling.medium_acceptance import POLICY
import yaml
ROOT=pathlib.Path('/tmp/codex/ltb1021/2026-09-10_medium-runtime_r01')
REPO=pathlib.Path('/workspace/contextra-analytics-runtime-lifecycle-refactor')
ENV=pathlib.Path('/workspace/contextra-runtime-config/runtime.env')
NEW='contextra-analytics:smoke-b272597'
def cmd(*args): return subprocess.check_output(args,text=True,stderr=subprocess.PIPE)
def write(name,data):
 p=ROOT/name; p.write_text(json.dumps(data,indent=2)); p.chmod(0o600)
def read_status(env):
 with urllib.request.urlopen('http://127.0.0.1:'+env['FASTAPI_HOST_PORT']+'/api/v1/streams',timeout=5) as r: return json.load(r)
env=load_env_file(str(ENV)); preflight=validate_deployment_inputs(str(ENV))
ids=cmd('docker','ps','-aq').split()
containers=json.loads(cmd('docker','inspect',*ids))
analytics=next(x for x in containers if x['Name']=='/contextra-analytics-1')
baseline={x['Id']:{'restart':x['RestartCount'],'oom':x['State']['OOMKilled'], 'status':x['State']['Status'],
 'health':x['State'].get('Health',{}).get('Status')} for x in containers}
assert env['CONTEXTRA_IMAGE']==analytics['Config']['Image']
rollback=json.loads(cmd('docker','image','inspect',env['CONTEXTRA_IMAGE']))[0]
assert rollback['Id']==analytics['Image']
assert subprocess.run(['docker','image','inspect',NEW],stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL).returncode!=0
streams=read_status(env)
if isinstance(streams,dict): streams=streams.get('streams',streams.get('items',[]))
assert len(streams)==1
assert all(x.get('state')=='stopped' and x.get('desired_state')=='stopped' and x.get('observed_state')=='stopped' for x in streams)
target=pathlib.Path(env['CONTEXTRA_MODEL_ROOT'])/'triton/RFDETRMedium'
versions=[int(p.name) for p in target.iterdir() if p.is_dir() and p.name.isdigit()]
version=max(versions,default=0)+1
plan=deployment_plan(pathlib.Path('/data/contextra/model-artifacts/builds/medium-193-20260909-v4'),target,version,source_acceptance=POLICY)
assert plan['source_acceptance']['status']=='LIMITED_USER_VISUAL_ACCEPTANCE'
assert shutil.disk_usage('/').free>=25*1024**3
ps=cmd('ps','-eo','args').splitlines()
assert not any(s.startswith(('docker build ','docker buildx build ','docker pull ')) for s in ps)
gpu=cmd('nvidia-smi','--query-gpu=index,name,compute_cap,memory.total,memory.used,utilization.gpu','--format=csv,noheader,nounits').strip()
state={'stage':'GATE_PASS','source':cmd('git','-C',str(REPO),'rev-parse','HEAD').strip(), 'new_tag':NEW,
 'rollback_tag':env['CONTEXTRA_IMAGE'],'rollback_image':analytics['Image'],'analytics_id':analytics['Id'],
 'env_sha256':hashlib.sha256(ENV.read_bytes()).hexdigest(),'target':str(target),'version':version,
 'model_snapshot':snapshot(target),'model_cas':plan['cas_token'],'containers':baseline,'gpu':gpu,
 'stream_count':len(streams),'root_free_gib':round(shutil.disk_usage('/').free/1024**3,2)}
write('gate.json',state); write('source-plan.json',plan)
print(json.dumps({k:v for k,v in state.items() if k not in ('containers','analytics_id')},indent=2))
