import hashlib,json,os,shutil,subprocess,time
from ops import HERE,PRIVATE,REPO,cmd,save
os.umask(0o077)
before=json.loads((HERE/'containers-before.json').read_text())
base='contextra-analytics:fight-crowd-337f77478e'
assert json.loads(cmd(['docker','image','inspect',base]))[0]['Id']==before['contextra-analytics-1']['image']
paths=['app/fall_runtime.py','app/fall_scenario.py','app/fight_runtime.py','app/fight_scenario.py']
hashes={n:hashlib.sha256((REPO/n).read_bytes()).hexdigest() for n in paths}
digest=hashlib.sha256(json.dumps(hashes,sort_keys=True).encode()).hexdigest()[:10]
snapshot=HERE/'image-source';snapshot.mkdir();(snapshot/'app').mkdir()
for n in paths:shutil.copyfile(REPO/n,snapshot/n);(snapshot/n).chmod(0o644)
recipe='FROM '+base+'\nCOPY app/ /opt/contextra/app/\n'
(snapshot/'Dockerfile').write_text(recipe)
tag='contextra-analytics:demo-pr12-'+digest
save('build-intent.json',dict(base=base,base_id=before['contextra-analytics-1']['image'],hashes=hashes,tag=tag,recipe=recipe))
with (HERE/'build.log').open('x') as log:
    p=subprocess.Popen(['docker','build','--pull=false','--network=none','--memory=2g','--cpu-period=100000','--cpu-quota=200000',
        '-t',tag,str(snapshot)],env=dict(os.environ,DOCKER_BUILDKIT='0'),stdout=log,stderr=log,start_new_session=True)
    start=time.monotonic();lowest=shutil.disk_usage('/').free
    while p.poll() is None:
        lowest=min(lowest,shutil.disk_usage('/').free)
        if time.monotonic()-start>180 or lowest<15*1024**3:
            p.terminate();p.wait(15);raise RuntimeError('BUILD_RESOURCE_BOUND')
        time.sleep(1)
assert p.returncode==0,'BUILD_FAILED; inspect retained log; no blind retry'
image=json.loads(cmd(['docker','image','inspect',tag]))[0]['Id']
save('image.json',dict(tag=tag,id=image,lowest_root_bytes=lowest))
print(json.dumps(dict(tag=tag,id=image)))
