feat(pool): add mTLS worker transport and heartbeat agent
This commit is contained in:
parent
bdb82e35dd
commit
c40c3fdb61
3 changed files with 52 additions and 7 deletions
33
server-tools/persona-compute-pool/worker_agent.py
Normal file
33
server-tools/persona-compute-pool/worker_agent.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Opt-in worker heartbeat agent; it never executes arbitrary scheduler commands."""
|
||||
from __future__ import annotations
|
||||
import json, os, ssl, time, urllib.request, shutil
|
||||
from datetime import datetime, timezone
|
||||
|
||||
NODE=os.environ["GH_WORKER_NODE_ID"]
|
||||
CONTROLLER=os.environ.get("GH_POOL_CONTROLLER","https://124.222.54.198:8787")
|
||||
CA=os.environ.get("GH_WORKER_CA", "/etc/guanghu-compute-pool/tls/ca.crt")
|
||||
CERT=os.environ.get("GH_WORKER_CERT", f"/etc/guanghu-compute-pool/tls/{NODE}.crt")
|
||||
KEY=os.environ.get("GH_WORKER_KEY", f"/etc/guanghu-compute-pool/tls/{NODE}.key")
|
||||
INTERVAL=float(os.environ.get("GH_WORKER_INTERVAL","30"))
|
||||
|
||||
def metrics():
|
||||
mem={}
|
||||
try:
|
||||
for line in open('/proc/meminfo'):
|
||||
key,value,*_=line.split(); mem[key]=int(value)*1024
|
||||
except OSError: pass
|
||||
usage=shutil.disk_usage('/')
|
||||
return {'cpu_cores':os.cpu_count() or 1,'memory_total_bytes':mem.get('MemTotal'),'memory_available_bytes':mem.get('MemAvailable'),'disk_free_bytes':usage.free,'load_1m':os.getloadavg()[0] if hasattr(os,'getloadavg') else None}
|
||||
|
||||
def heartbeat():
|
||||
payload={'node_id':NODE,'observed_at':datetime.now(timezone.utc).isoformat(),'metrics':metrics(),'state':'ACTIVE_WORKER','authority_granted':False}
|
||||
request=urllib.request.Request(CONTROLLER+'/v1/worker/heartbeat',data=json.dumps(payload).encode(),headers={'Content-Type':'application/json'},method='POST')
|
||||
context=ssl.create_default_context(cafile=CA); context.load_cert_chain(CERT,KEY); context.check_hostname=False; context.verify_mode=ssl.CERT_REQUIRED
|
||||
with urllib.request.urlopen(request,context=context,timeout=10) as response: return json.loads(response.read())
|
||||
|
||||
if __name__=='__main__':
|
||||
while True:
|
||||
try: heartbeat()
|
||||
except Exception: pass
|
||||
time.sleep(INTERVAL)
|
||||
Loading…
Reference in a new issue