53 lines
2.5 KiB
Python
53 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
from pathlib import Path
|
|
import os, sys, time, subprocess, json, urllib.request, urllib.parse, http.cookiejar, socket
|
|
|
|
root=Path(__file__).resolve().parents[1]
|
|
app=root/'active-runtime'/'app'/'aios_webops_app.py'
|
|
port=int(os.environ.get('AIOS_WEBOPS_UAT_PORT','18189'))
|
|
env=os.environ.copy()
|
|
env.setdefault('AIOS_WEBOPS_ROOT', str(root/'active-runtime'))
|
|
env.setdefault('AIOS_WEBOPS_SECRET','uat-secret')
|
|
env.setdefault('AIOS_OWNER_USERNAME','owner')
|
|
env.setdefault('AIOS_OWNER_PASSWORD','bootstrap-change-me')
|
|
env['AIOS_WEBOPS_PORT']=str(port)
|
|
env['AIOS_WEBOPS_DB']=str(root/'active-runtime'/'data'/'uat_webops_v5.sqlite3')
|
|
try:
|
|
(root/'active-runtime'/'data'/'uat_webops_v5.sqlite3').unlink()
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
p=subprocess.Popen([sys.executable,str(app)], env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
|
|
base=f'http://127.0.0.1:{port}'
|
|
try:
|
|
# wait for ready
|
|
last=''
|
|
for _ in range(30):
|
|
try:
|
|
with urllib.request.urlopen(base+'/health/ready', timeout=2) as r:
|
|
ready=json.loads(r.read().decode())
|
|
break
|
|
except Exception as e:
|
|
last=str(e); time.sleep(0.3)
|
|
else:
|
|
raise RuntimeError('webops not ready: '+last)
|
|
assert ready['roles']==['owner','admin','user'], ready
|
|
assert 'server-hw' in ready['nodes'] and 'server-local' in ready['nodes'], ready
|
|
# login owner and verify core pages
|
|
cj=http.cookiejar.CookieJar()
|
|
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
|
|
data=urllib.parse.urlencode({'username':'owner','password':'bootstrap-change-me'}).encode()
|
|
opener.open(urllib.request.Request(base+'/login', data=data, method='POST'), timeout=5).read()
|
|
for page in ['/dashboard','/nodes','/roles','/routing','/failover','/approvals','/operations','/users','/quota','/models','/memory','/channels/wechat','/life','/patches','/optimization','/simulation','/logs','/config','/uat','/versions','/evidence']:
|
|
html=opener.open(base+page, timeout=5).read().decode(errors='ignore')
|
|
assert '<html' in html.lower() or '<!doctype' in html.lower(), page
|
|
# run UAT through API
|
|
req=urllib.request.Request(base+'/api/uat/run', data=b'{}', headers={'Content-Type':'application/json'}, method='POST')
|
|
res=json.loads(opener.open(req, timeout=10).read().decode())
|
|
assert res.get('status')=='PASS', res
|
|
print('V5_UAT_OK', json.dumps({'ready':ready,'uat':res}, ensure_ascii=False))
|
|
finally:
|
|
p.terminate()
|
|
try: p.wait(timeout=5)
|
|
except Exception: p.kill()
|